home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / MTASK.PAS < prev    next >
Pascal/Delphi Source File  |  1997-01-29  |  5KB  |  223 lines

  1. UNIT MTask;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Multitask detection                           Last changed: 29.01.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, PoPTypes;
  16.  
  17. VAR
  18.   MultiTasker         : Byte;  { 0=None
  19.                                  1=OS/2
  20.                                  2=Windows
  21.                                  3=DesqView
  22.                                  4=TaskView
  23.                                  5=TopView
  24.                                  6=DoubleDos
  25.                                  7=Virtual   }
  26.   TaskVersion: Word;
  27.  
  28. PROCEDURE DV_Begin_Critical;           { Disallow giving away time }
  29. PROCEDURE DV_End_Critical;             { Allow giving away timeslices }
  30. PROCEDURE DV_Sound(freq,dur:integer);  { Sound a tone }
  31.  
  32. PROCEDURE GiveUpTime;
  33. FUNCTION  MultiName(i:BYTE):S9;
  34.  
  35. IMPLEMENTATION
  36.  
  37. USES Dos
  38. {$IFDEF OS2}
  39.      , Os2Base
  40. {$ENDIF}
  41.      ;
  42.  
  43.  
  44.   FUNCTION MultiName(i: Byte):S9;
  45.   BEGIN
  46.     CASE i OF
  47.       0 : MultiName:='None';
  48.       1 : MultiName:='OS/2';
  49.       2 : MultiName:='Windows';
  50.       3 : MultiName:='DesqView';
  51.       4 : MultiName:='TaskView';
  52.       5 : MultiName:='TopView';
  53.       6 : MultiName:='DoubleDos';
  54.       7 : MultiName:='Virtual';
  55.     END;
  56.   END;
  57.  
  58.   PROCEDURE DV_Begin_Critical; assembler;
  59.   ASM
  60.     MOV AX,$101B       { DV critical function }
  61.     INT 15h
  62.   END; { DV_Begin_Critical }
  63.  
  64.   PROCEDURE DV_End_Critical; assembler;
  65.   ASM
  66.     MOV AX,$101C       { DV END critical }
  67.     INT 15h
  68.   END; { DV_End_Critical }
  69.  
  70.   PROCEDURE DV_Sound(freq,dur:integer); assembler; { sound a tone }
  71.   ASM
  72. {$IFNDEF OS2}
  73.     MOV   AX,1019H
  74.     MOV   BX,freq  { frequency above 20 Hz }
  75.     MOV   CX,dur   { duration in clock ticks }
  76.     INT   15H
  77. {$ENDIF}
  78.   END;
  79.  
  80.   PROCEDURE GiveUpTime;
  81.   BEGIN
  82. {$IFDEF OS2}
  83.     DosSleep(1);
  84. {$ELSE}
  85.     CASE MultiTasker OF
  86.       0 : ASM
  87.             sti
  88.             int 28h
  89.           END;
  90.       1 : ASM
  91.             int 28h
  92. {
  93.             sti
  94.             xor dx,dx
  95.             mov ax,1
  96.             hlt
  97.             db $35,$ca
  98.             mov ax,1680h
  99.             int 2fh
  100. }
  101.           END;
  102.     2,7 : ASM
  103.             mov ax,1680h
  104.             int 2fh
  105.           END;
  106.     3,5 : ASM
  107.             mov ax,1000h
  108.             int 15h
  109.           END;
  110.       4 : ;
  111.       6 : ASM
  112.             mov ax, 0fe01h
  113.             int 21h
  114.           END;
  115.     END;
  116. {$ENDIF}
  117.   END;
  118.  
  119. {$IFNDEF OS2}
  120.   PROCEDURE InitTasker;
  121.   VAR
  122.     R : Registers;
  123.   BEGIN
  124.     With R Do
  125.     BEGIN
  126.  
  127.       {-- OS/2 --------------}
  128.  
  129.       IF Lo(DosVersion)>=20 THEN
  130.       BEGIN
  131.         MultiTasker:=1;
  132.         TaskVersion:=((Lo(DosVersion) Div 10)*256)+Hi(DosVersion);
  133.         Exit;
  134.       END;
  135.  
  136.       {-- Windows -----------}
  137.  
  138.       AX:=$4680; Intr($2F,R);
  139.       IF AX=0 THEN MultiTasker:=2
  140.       Else BEGIN
  141.         AX:=$160A; BX:=0; Intr($2F,R);
  142.         IF BX<>0 THEN
  143.         BEGIN
  144.           MultiTasker:=2;
  145.           TaskVersion:=BX;
  146.           Exit;
  147.         END;
  148.       END;
  149.  
  150.       {-- DesqView ----------}
  151.  
  152.       CH:=68; CL:=69; DH:=83; DL:=81; AX:=$2B01; Intr($21,R);
  153.       IF AL<>255 THEN
  154.       BEGIN
  155.         MultiTasker:=3;
  156.   {      DirectVideo:=False;
  157.         ES:=VideoSeg;
  158.         AH:=$FE;
  159.         Intr($10,R);
  160.         AlternateScreenAddr:=ES;
  161.         IF AlternateScreenAddr<>0 THEN VideoSeg:=AlternateScreenAddr;
  162.         TaskVersion:=BX;}
  163.         Exit;
  164.       END;
  165.  
  166.       {-- TaskView ----------} {-- TopView -----------}
  167.  
  168.       AX:=$1022; BX:=0; Intr($15,R);
  169.       IF BX=1 THEN  { TaskView }
  170.       BEGIN
  171.         MultiTasker:=4;
  172.   {      DirectVideo:=False;}
  173.         Exit;
  174.       END ELSE
  175.         IF BX<>0 THEN
  176.         BEGIN
  177.           TaskVersion:=Swap(BX);
  178.           MultiTasker:=5;
  179.   {       DirectVideo:=False;
  180.           AH:=$FE; ES:=VideoSeg; DI:=0; Intr($10,R);
  181.           ES:=VideoSeg;}
  182.           Exit;
  183.         END;
  184.  
  185.       {-- DoubleDos ---------}
  186.  
  187.       AX:=$F400;  Intr($21,R);
  188.       IF AL<>0 THEN
  189.       BEGIN
  190.         MultiTasker:=6;
  191.   {      DirectVideo:=False;
  192.         AH:=$FC; ES:=0; Intr($21,R);
  193.         IF ES<>0 THEN VideoSeg:=ES;}
  194.         Exit;
  195.       END;
  196.  
  197.       {-- Virtual -----------}
  198.  
  199.       ASM
  200.         MOV AX, 1680h
  201.         INT 2Fh          { Gives up time slice in most 386+ virtual machines }
  202.         CMP AL,0
  203.         JNE @NoVir
  204.         MOV MultiTasker,7
  205. @NoVir:
  206.       END;
  207.   {    IF MultiTasker=7 THEN Exit;}
  208.  
  209.     END;
  210.   END;
  211. {$ENDIF}
  212.  
  213. BEGIN
  214. {$IFNDEF OS2}
  215.   TaskVersion:=0;
  216.   MultiTasker:=0;
  217.   InitTasker;
  218. {$ELSE}
  219.   MultiTasker:=1;
  220. {$ENDIF}
  221. END.
  222.  
  223.